
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of AlmacenamientosData.
	/// </summary>
	public class AlmacenamientosData : Singleton<AlmacenamientosData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

		/// <summary>
		/// Selects all records from the Almacenamientos table by a foreign key.
		/// </summary>
		public IList<Almacenamientos> Listar()
		{
			var entidades = new List<Almacenamientos>();
			var comando = BaseDatos.GetStoredProcCommand("SelectAllAlmacenamientos");

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Almacenamientos
					{
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						orden = lector.IsDBNull(lector.GetOrdinal("orden"))? default(byte) : lector.GetByte(lector.GetOrdinal("orden")),
						stock = lector.IsDBNull(lector.GetOrdinal("stock"))? default(float) : lector.GetFloat(lector.GetOrdinal("stock"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the Almacenamientos table by a foreign key.
		/// </summary>
		public Almacenamientos Obtener(int loteID, short almacenID)
		{
			var almacenamientos = default(Almacenamientos);
			var comando = BaseDatos.GetStoredProcCommand("SelectAlmacenamientos");

			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					almacenamientos = new Almacenamientos
					{
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						orden = lector.IsDBNull(lector.GetOrdinal("orden"))? default(byte) : lector.GetByte(lector.GetOrdinal("orden")),
						stock = lector.IsDBNull(lector.GetOrdinal("stock"))? default(double) : lector.GetDouble(lector.GetOrdinal("stock"))
					};
				}
			}
			comando.Dispose();
			return almacenamientos;
		}

		/// <summary>
		/// Saves a record to the Almacenamientos table.
		/// </summary>
		public int Agregar(int loteID, Almacenamientos almacenamientos, DbTransaction transaccion)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertAlmacenamientos");
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenamientos.almacenID);
			BaseDatos.AddInParameter(comando, "orden", DbType.Byte, almacenamientos.orden);
			BaseDatos.AddInParameter(comando, "stock", DbType.Single, almacenamientos.stock);

            var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
			if (resultado == 0) throw new Exception("Error al Agregar Almacenamientos.");

			comando.Dispose();
			return 1;
		}

		/// <summary>
		/// Updates a record in the Almacenamientos table.
		/// </summary>
		public bool Modificar(Almacenamientos almacenamientos)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateAlmacenamientos");
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, almacenamientos.loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenamientos.almacenID);
			BaseDatos.AddInParameter(comando, "orden", DbType.Byte, almacenamientos.orden);
			BaseDatos.AddInParameter(comando, "stock", DbType.Single, almacenamientos.stock);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar Almacenamientos.");

			comando.Dispose();
			return true;
        }

        /// <summary>
        /// Updates a record in the Insumos table.
        /// </summary>
        public bool ModificarStock(int loteID, short almacenID, double variacionStock, DbTransaction transaccion)
        {
            var comando = BaseDatos.GetStoredProcCommand("UpdateAlmacenamientosStock");
            BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);
            BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);
            BaseDatos.AddInParameter(comando, "variacionStock", DbType.Single, variacionStock);

            var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
            if (resultado == 0) throw new Exception("Error al Modificar Stock de Almacen de Insumos.");

            comando.Dispose();
            return true;
        }

		/// <summary>
		/// Deletes a record from the Almacenamientos table by its primary key.
		/// </summary>
		public bool Eliminar(int loteID, short almacenID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteAlmacenamientos");
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Almacenamientos.");
			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Almacenamientos table by a foreign key.
		/// </summary>
		public void EliminarPorAlmacenID(short almacenID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteAlmacenamientosByAlmacenID");
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Almacenamientos.");
			comando.Dispose();
		}

		/// <summary>
		/// Deletes a record from the Almacenamientos table by a foreign key.
		/// </summary>
		public void EliminarPorLoteID(int loteID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteAlmacenamientosByLoteID");
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Almacenamientos.");
			comando.Dispose();
		}

		/// <summary>
		/// Selects all records from the Almacenamientos table by a foreign key.
		/// </summary>
		public IList<Almacenamientos> ListarPorAlmacenID(short almacenID)
		{
			var entidades = new List<Almacenamientos>();
			var comando = BaseDatos.GetStoredProcCommand("SelectAlmacenamientosByAlmacenID");

			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Almacenamientos
					{
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						orden = lector.IsDBNull(lector.GetOrdinal("orden"))? default(byte) : lector.GetByte(lector.GetOrdinal("orden")),
						stock = lector.IsDBNull(lector.GetOrdinal("stock"))? default(float) : lector.GetFloat(lector.GetOrdinal("stock"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the Almacenamientos table by a foreign key.
		/// </summary>
		public IList<Almacenamientos> ListarPorLoteID(int loteID)
		{
			var entidades = new List<Almacenamientos>();
			var comando = BaseDatos.GetStoredProcCommand("SelectAlmacenamientosByLoteID");

			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Almacenamientos
					{
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
						orden = lector.IsDBNull(lector.GetOrdinal("orden"))? default(byte) : lector.GetByte(lector.GetOrdinal("orden")),
						stock = lector.IsDBNull(lector.GetOrdinal("stock"))? default(double) : lector.GetDouble(lector.GetOrdinal("stock"))
					});
				}
			}
			comando.Dispose();
			return entidades;
        }

        /// <summary>
        /// Selects all records from the Almacenamientos table by a foreign key.
        /// </summary>
        public IList<Almacenamientos> ListarVendiblesPorLoteID(int loteID)
        {
            var entidades = new List<Almacenamientos>();
            var comando = BaseDatos.GetStoredProcCommand("SelectAlmacenamientosVendiblesByLoteID");

            BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Almacenamientos
                    {
                        loteID = lector.IsDBNull(lector.GetOrdinal("loteID")) ? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
                        almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID")) ? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
                        orden = lector.IsDBNull(lector.GetOrdinal("orden")) ? default(byte) : lector.GetByte(lector.GetOrdinal("orden")),
                        stock = lector.IsDBNull(lector.GetOrdinal("stock")) ? default(double) : lector.GetDouble(lector.GetOrdinal("stock"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

		#endregion
	}
}
